package com.hzqy.web.filter;

import com.hzqy.commons.utils.SystemConfigUtils;
import com.hzqy.service.hqjc.HqjcServiceBean;
import com.hzqy.service.pms.PmsOrgServiceBean;
import com.hzqy.web.login.SessionKey;
import com.hzqy.web.vo.CmContentVo;
import com.hzqy.web.vo.EpgInfoVo;
import com.hzqy.web.vo.PmsOrgVo;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.UnsupportedEncodingException;

//重点注意：此Filter模块目前业务规则只适用酒店行业应用和学校行业应用，增值类怀球剧场、教育、K歌等都不适用，需要在WEB-INF/web.xml中注释。

/**
 * 1、根据session中的业务账号查找归属企业或学校ID
 * 2、后续根据分类得到内容业务规则是当有企业ID或学校ID的用户取对应的信息，
 *   如果业务账号未归属任何企业或学校，则出现提示此账号未受理，请联系客户经理，底下有进入宽带电视按钮。
 *   酒店行业应用是出现默认木纹模板。
 * @author Administrator
 *
 */
public class OrgIndustryModelFilter implements Filter {
	private static final Log LOG = LogFactory.getLog(OrgIndustryModelFilter.class);
	
	public void init(FilterConfig fConfig) throws ServletException {
		LOG.debug("查询用户模板信息过滤器启动...");
	}
	
	/**
	 * 判断uri是否需要进入过滤器进行业务处理
	 */
	public boolean isUnfilteredUri(String uri) {
		return uri.endsWith("warn.jsp")||uri.endsWith(".do") || uri.endsWith("demo.jsp") || uri.endsWith("error.jsp") || uri.endsWith("release.jsp") || 
				uri.endsWith("service_authentication.jsp") || uri.endsWith("service_order.jsp") || uri.endsWith("service_order_back.jsp") || 
				uri.endsWith("service.jsp") || uri.endsWith(".jpg") || uri.endsWith(".gif") || uri.endsWith(".js") ||
				uri.endsWith(".png") || uri.indexOf("/PIC/")>=0|| uri.endsWith(".mp4")|| uri.endsWith(".mp3")|| uri.endsWith("dispatcher.jsp") || uri.endsWith("not_bind_model.jsp") || 
				uri.indexOf("tv_proving") >= 0 || uri.indexOf("/interface/") >= 0  || (uri.indexOf("/mobile_tv_wchat_service/") >= 0);
	}
	/**
	 * 在实现时注意当用户取到归属企业或学校ID后，应存入session中key为SessionKey.SESSION_USER_FOR_ORG_INFO，存储com.hzqy.web.vo.PmsOrgVo
	 * 当用户再请求平台其他资源时，应先判定session中是否有相关企业信息，有则不再进行查询操作。
	 * 
	 * Session : 
	 * 	{
	 * 		SessionKey.SESSION_USER_FOR_ORG_INFO, com.hzqy.web.vo.PmsOrgVo,
	 * 		SessionKey.SESSION_SERVERID, serverid
	 *  }
	 * 
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		HttpServletRequest req = ((HttpServletRequest)request);
		HttpServletResponse resp = ((HttpServletResponse)response);
		HttpSession session = req.getSession();
		String uri = req.getRequestURI();
		if(isUnfilteredUri(uri)) { //不过滤的页面
			chain.doFilter(request, response);
		}else{
			EpgInfoVo epgInfoVo = (EpgInfoVo) session.getAttribute(SessionKey.SESSION_EPGINFO_VO);
			String serverId = epgInfoVo.getOss_user_id();
			String epg_info = req.getParameter("epg_info");
			String jumpTypeId = req.getParameter("jumpTypeId");
			String company_mark = req.getParameter("company_mark");
			PmsOrgVo orgVo=(PmsOrgVo)session.getAttribute(SessionKey.SESSION_USER_FOR_ORG_INFO);
			boolean notBindModelFlag = true; //未绑定模板判定true未绑定，false绑定
			if(jumpTypeId!=null||(epg_info != null && epg_info.trim().length() > 0)||company_mark!=null){//按首页进入时重新对存储数据进行处理
				LOG.debug("session过期或者首次登陆，开始用户登录..jumpTypeId="+jumpTypeId);
				WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(session.getServletContext());
				HqjcServiceBean hqjcService = (HqjcServiceBean)webApplicationContext.getBean("hqjcServiceBean");
				if(company_mark!=null){//存在客户标识
					String udp_industry_digest=request.getParameter("udp_industry_digest");
					String currentTime= request.getParameter("currentTime");
					String secretKey =SystemConfigUtils.getSysConfig("industry_udp");
					String CHARSET="UTF-8";
					try {
						String digest=new String(DigestUtils.md5Hex((currentTime + company_mark + secretKey).getBytes(CHARSET)));
						if(digest.equals(udp_industry_digest)){//对比消息签名是否相同
							PmsOrgServiceBean pmsOrgServiceBean=(PmsOrgServiceBean)webApplicationContext.getBean("pmsOrgServiceBean");
							orgVo=pmsOrgServiceBean.selectPmsOrgVoById(company_mark);
						}//无法匹配签名
					}catch (UnsupportedEncodingException e) {
						e.printStackTrace();
					}
				}else{
					orgVo = hqjcService.selectPmsOrgByContentName(serverId); //这里定义业务账号必须绑定目录
				}
				if(orgVo!=null&&jumpTypeId==null){
					LOG.debug("查询得到 用户= "+serverId+" 对应的组织= "+orgVo.getF_po_name());
					session.setAttribute(SessionKey.SESSION_USER_FOR_ORG_INFO, orgVo);
					if(company_mark!=null&&orgVo.getF_po_model_url()!=null){//存在客户标识，不用查询模板地址
						notBindModelFlag = false;
						LOG.debug("非正常用户="+serverId+" 客户标识="+company_mark+"  对应的组织模板路径="+req.getContextPath()+orgVo.getF_po_model_url());
					}else if(orgVo.getF_po_model() > 0){
						CmContentVo contentVo = new CmContentVo();
						contentVo.setF_cc_id(orgVo.getF_po_model());
						contentVo=hqjcService.selectContent(contentVo);
						if(contentVo != null){//获取企业绑定模板路径
							String modelPath=contentVo.getF_cc_desc().replaceAll("<([^>]*)>","");
							notBindModelFlag = false;
							orgVo.setF_po_model_url(modelPath);
							orgVo.setGroupId(contentVo.getF_cc_end());//将模板epg分组设置进入
							session.setAttribute(SessionKey.SESSION_USER_FOR_ORG_INFO, orgVo);
							LOG.debug("用户="+serverId+" 对应的组织模板路径="+req.getContextPath()+modelPath);
						}else{
							LOG.error("无法获取id=" + orgVo.getF_po_model() + "的模版内容 业务账号="+serverId);
						}
					}else{
						LOG.error("组织=" + orgVo.getF_po_name() + " 未选择模版！");
					}
				}else{
					LOG.debug("查到 用户= "+serverId+" 没有对应的组织");
					if(jumpTypeId!=null){//直接访问模板地址时放通该请求
						try{
							CmContentVo contentVo = new CmContentVo();
							contentVo.setF_cc_id(Integer.parseInt(jumpTypeId));
							contentVo=hqjcService.selectContent(contentVo);
							if(contentVo!=null&&contentVo.getF_cc_type()==20){
								String modelPath=contentVo.getF_cc_desc().replaceAll("<([^>]*)>","");
								orgVo=new PmsOrgVo();
								orgVo.setF_po_model_url(modelPath);
								orgVo.setGroupId(contentVo.getF_cc_end());
								session.setAttribute(SessionKey.SESSION_USER_FOR_ORG_INFO, orgVo);
								notBindModelFlag = false;
								LOG.debug("用户="+serverId+" 对应的组织模板路径="+modelPath);
							}
						}catch(Exception e){
							LOG.error("登入模板错误",e);
						}
					}
				}
				
				if(notBindModelFlag) {
					LOG.error("查询用户模板信息失败 未找到用户"+serverId+"对应的模板 orgVo="+orgVo);
					resp.sendRedirect(req.getContextPath()+"/industry/hd/commons/model_01/index.html"); //重定向到未开通页面
				} else {
					LOG.debug("已经存在模板 用户="+serverId+" 对应的企业="+orgVo.getF_po_name()+" 对应的模板路径="+orgVo.getF_po_model_url());
					chain.doFilter(request, response);
				}
			} else {
				chain.doFilter(request, response);
			}
		}
	}
	
	public void destroy() {
		LOG.debug("查询用户模板信息过滤器销毁...");
	}
	
}
